সি প্রোগ্রামিং ভাষায় ডাইনামিক মেমোরি অ্যালোকেশন হল একটি পদ্ধতি যার মাধ্যমে প্রোগ্রাম রানটাইমে প্রয়োজন অনুযায়ী মেমোরি বরাদ্দ করে। ডাইনামিক মেমোরি ব্যবহারে প্রোগ্রামার মেমোরির আকার এবং ব্যবস্থাপনা সরাসরি নিয়ন্ত্রণ করতে পারেন। সাধারণত malloc()
, calloc()
, realloc()
এবং free()
ফাংশনগুলো ব্যবহার করে ডাইনামিক মেমোরি অ্যালোকেশন এবং মুক্তকরণ সম্পন্ন করা হয়। এগুলো সি স্ট্যান্ডার্ড লাইব্রেরির stdlib.h
হেডার ফাইলের অন্তর্গত।
ডাইনামিক মেমোরি ব্যবহার তখনই প্রয়োজন, যখন প্রোগ্রাম তৈরির সময় মেমোরির আকার নির্দিষ্ট করা সম্ভব না হয় এবং প্রোগ্রামের কাজের সময় মেমোরি আকার নির্ধারণ করা প্রয়োজন হয়। এটি বিশেষ করে ডেটা স্ট্রাকচার যেমন লিংকড লিস্ট, স্ট্যাক, কিউ, ট্রি ইত্যাদির জন্য অত্যন্ত গুরুত্বপূর্ণ।
malloc()
– মেমোরি বরাদ্দ করাmalloc()
(Memory Allocation) ফাংশনটি নির্দিষ্ট বাইটের মেমোরি বরাদ্দ করে এবং মেমোরির প্রথম ঠিকানাটি (পয়েন্টার) রিটার্ন করে। মেমোরি ব্লকটি পূর্ববর্তী ডেটা সহ পাওয়া যায় এবং সেটিকে শূন্য দিয়ে পূর্ণ করে না।
void *malloc(size_t size);
size
: বরাদ্দকৃত মেমোরির আকার, যা বাইটে নির্দিষ্ট করা হয়।#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// মেমোরি বরাদ্দ
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory not allocated.\n");
return 1;
} else {
printf("Memory successfully allocated using malloc.\n");
}
free(arr); // মেমোরি মুক্ত করা
return 0;
}
calloc()
– শূন্য দিয়ে মেমোরি বরাদ্দcalloc()
(Contiguous Allocation) ফাংশনটি মেমোরি বরাদ্দ করার সময় প্রতিটি মেমোরি ব্লককে শূন্য দিয়ে পূর্ণ করে। এটি malloc()
এর মতোই, তবে এটি নির্দিষ্ট সংখ্যক ব্লক বরাদ্দ করতে ব্যবহৃত হয় এবং প্রতিটি ব্লককে শূন্য দিয়ে পূর্ণ করে।
void *calloc(size_t num, size_t size);
num
: ব্লকের সংখ্যা।size
: প্রতিটি ব্লকের আকার।#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// শূন্য দিয়ে মেমোরি বরাদ্দ
arr = (int *)calloc(n, sizeof(int));
if (arr == NULL) {
printf("Memory not allocated.\n");
return 1;
} else {
printf("Memory successfully allocated using calloc.\n");
}
free(arr); // মেমোরি মুক্ত করা
return 0;
}
realloc()
– মেমোরির আকার পরিবর্তন করাrealloc()
(Reallocation) ফাংশনটি পূর্বে বরাদ্দকৃত মেমোরির আকার পরিবর্তন করতে ব্যবহৃত হয়। এটি malloc()
বা calloc()
দ্বারা বরাদ্দকৃত মেমোরি পুনরায় বরাদ্দ করে এবং নতুন আকার অনুযায়ী মেমোরি বাড়ায় বা কমায়।
void *realloc(void *ptr, size_t new_size);
ptr
: পূর্বে বরাদ্দকৃত মেমোরির পয়েন্টার।new_size
: নতুন মেমোরির আকার, যা বাইটে নির্দিষ্ট করা হয়।#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// মেমোরি বরাদ্দ
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory not allocated.\n");
return 1;
}
// মেমোরির আকার পরিবর্তন
n = 10;
arr = (int *)realloc(arr, n * sizeof(int));
if (arr == NULL) {
printf("Memory reallocation failed.\n");
return 1;
} else {
printf("Memory successfully reallocated using realloc.\n");
}
free(arr); // মেমোরি মুক্ত করা
return 0;
}
free()
– মেমোরি মুক্ত করাfree()
ফাংশনটি পূর্বে বরাদ্দকৃত মেমোরি ব্লক মুক্ত করতে ব্যবহৃত হয়। এটি মেমোরি ব্যবস্থাপনাকে কার্যকরী করে এবং প্রোগ্রাম শেষ হওয়ার পর মেমোরি লিক (memory leak) এড়াতে সাহায্য করে।
void free(void *ptr);
ptr
: পূর্বে বরাদ্দকৃত মেমোরির পয়েন্টার।#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// মেমোরি বরাদ্দ
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory not allocated.\n");
return 1;
}
// মেমোরি মুক্ত করা
free(arr);
printf("Memory successfully freed.\n");
return 0;
}
ফাংশন | কাজ |
---|---|
malloc() | নির্দিষ্ট আকারের মেমোরি বরাদ্দ করে |
calloc() | নির্দিষ্ট আকারের শূন্য দিয়ে মেমোরি বরাদ্দ করে |
realloc() | পূর্বে বরাদ্দকৃত মেমোরির আকার পরিবর্তন করে |
free() | বরাদ্দকৃত মেমোরি মুক্ত করে |
ডাইনামিক মেমোরি অ্যালোকেশন সি প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা প্রোগ্রামারকে মেমোরি পরিচালনায় আরও নিয়ন্ত্রণ প্রদান করে। malloc()
, calloc()
, realloc()
, এবং free()
ফাংশনগুলো ডাইনামিক মেমোরি বরাদ্দ, পুনরায় বরাদ্দ এবং মুক্ত করার জন্য ব্যবহৃত হয়। সঠিকভাবে মেমোরি ম্যানেজমেন্ট না করলে মেমোরি লিকের সমস্যা হতে পারে, তাই এই ফাংশনগুলোর সঠিক ব্যবহারে সতর্কতা অবলম্বন করা উচিত।
ডাইনামিক মেমোরি অ্যালোকেশন (Dynamic Memory Allocation) হলো সেই প্রক্রিয়া, যার মাধ্যমে প্রোগ্রাম রানটাইমে (প্রোগ্রাম চলাকালীন) মেমোরি বরাদ্দ এবং মুক্ত করতে পারে। সি প্রোগ্রামিং ভাষায় ডাইনামিক মেমোরি অ্যালোকেশন প্রয়োজন হয় যখন আমরা পূর্বনির্ধারিত মেমোরি সীমাবদ্ধতার বাইরে গিয়ে ডেটা সংগ্রহ বা স্টোর করতে চাই। এই প্রক্রিয়ায় মেমোরি স্ট্যাকের পরিবর্তে হিপ (heap) থেকে বরাদ্দ করা হয়।
১. রানটাইমে মেমোরি বরাদ্দ: প্রোগ্রাম চলাকালীন সময়ে ডেটার আকার অনুযায়ী মেমোরি বরাদ্দ করতে হলে ডাইনামিক মেমোরি অ্যালোকেশন ব্যবহার করতে হয়। উদাহরণস্বরূপ, যদি ইউজার ইনপুটের উপর ভিত্তি করে মেমোরি বরাদ্দ করতে হয়, তবে ডাইনামিক মেমোরি অ্যালোকেশন প্রয়োজন।
২. মেমোরি ব্যবহারের কার্যকারিতা বৃদ্ধি: ডাইনামিক মেমোরি বরাদ্দের মাধ্যমে প্রয়োজন অনুযায়ী মেমোরি বরাদ্দ এবং মুক্ত করে মেমোরি ব্যবহারের কার্যকারিতা বাড়ানো যায়। ফলে প্রোগ্রামের কার্যক্ষমতা উন্নত হয়।
৩. আনলিমিটেড ডেটা স্টোরেজ: পূর্বনির্ধারিত মেমোরি সীমাবদ্ধতা ছাড়িয়ে বেশি ডেটা সংরক্ষণের প্রয়োজন হলে ডাইনামিক মেমোরি অ্যালোকেশন ব্যবহার করা হয়।
সি ভাষায় ডাইনামিক মেমোরি অ্যালোকেশনের জন্য stdlib.h
হেডার ফাইলে থাকা কিছু গুরুত্বপূর্ণ ফাংশন ব্যবহার করা হয়। নিচে এই ফাংশনগুলোর বর্ণনা দেওয়া হলো।
malloc()
– মেমোরি বরাদ্দ করাmalloc()
ফাংশনটি নির্দিষ্ট আকারের মেমোরি ব্লক বরাদ্দ করে এবং একটি পয়েন্টার রিটার্ন করে যা বরাদ্দকৃত মেমোরি ব্লকের শুরুতে নির্দেশ করে। malloc()
ফাংশনটি বরাদ্দকৃত মেমোরিকে নির্দিষ্ট করে না, তাই এতে যেকোনো পূর্বের মান থাকতে পারে।
সিঙ্কট্যাক্স:
void *malloc(size_t size);
উদাহরণ:
int *arr = (int *)malloc(5 * sizeof(int)); // ৫টি ইন্টিজার জন্য মেমোরি বরাদ্দ
calloc()
– শূন্য-মেমোরি বরাদ্দcalloc()
ফাংশনটি নির্দিষ্ট আকার এবং সংখ্যক মেমোরি ব্লক বরাদ্দ করে এবং বরাদ্দকৃত মেমোরিকে শূন্য দিয়ে পূর্ণ করে।
সিঙ্কট্যাক্স:
void *calloc(size_t num, size_t size);
উদাহরণ:
int *arr = (int *)calloc(5, sizeof(int)); // ৫টি ইন্টিজার জন্য শূন্য-মেমোরি বরাদ্দ
realloc()
– মেমোরি পুনরায় বরাদ্দrealloc()
ফাংশনটি পূর্বে বরাদ্দকৃত মেমোরি ব্লকের আকার পরিবর্তন করতে ব্যবহৃত হয়। এটি পূর্ববর্তী মেমোরি ব্লকের উপরে একটি নতুন আকারের মেমোরি বরাদ্দ করে এবং পূর্ববর্তী ডেটাকে সংরক্ষণ করে।
সিঙ্কট্যাক্স:
void *realloc(void *ptr, size_t new_size);
উদাহরণ:
arr = (int *)realloc(arr, 10 * sizeof(int)); // মেমোরি ব্লককে ১০টি ইন্টিজারে বাড়ানো
free()
– মেমোরি মুক্ত করাfree()
ফাংশনটি ডাইনামিক্যালি বরাদ্দকৃত মেমোরি ব্লককে মুক্ত করতে ব্যবহৃত হয়। এটি মেমোরি লিক প্রতিরোধ করে এবং সিস্টেমে মেমোরি পুনরায় ব্যবহারযোগ্য করে তোলে।
সিঙ্কট্যাক্স:
void free(void *ptr);
উদাহরণ:
free(arr); // মেমোরি মুক্ত করা
নিচে একটি উদাহরণ দেওয়া হলো, যেখানে ডাইনামিক মেমোরি বরাদ্দ করে ব্যবহার করা হয়েছে:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int)); // ডাইনামিক মেমোরি বরাদ্দ
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// মেমোরি ব্যবহার
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// আউটপুট প্রদর্শন
printf("Array elements: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // মেমোরি মুক্ত করা
return 0;
}
১. মেমোরি লিক: ডাইনামিক মেমোরি বরাদ্দের পরে free()
ব্যবহার করে মেমোরি মুক্ত না করলে মেমোরি লিক হতে পারে, যা সিস্টেমের কার্যকারিতা কমিয়ে দেয়।
২. মেমোরি বরাদ্দ ব্যর্থতা: ডাইনামিক মেমোরি বরাদ্দের সময় মেমোরি বরাদ্দ ব্যর্থ হতে পারে। তাই প্রতিটি বরাদ্দের পরে NULL
পয়েন্টার চেক করা জরুরি।
৩. অতিরিক্ত ব্যবহার: বরাদ্দকৃত মেমোরির বাইরে অ্যাক্সেস করার চেষ্টা করলে প্রোগ্রাম ক্র্যাশ হতে পারে। বরাদ্দকৃত মেমোরির আকারের বাইরে ডেটা অ্যাক্সেস করা থেকে বিরত থাকা উচিত।
ডাইনামিক মেমোরি অ্যালোকেশন সি প্রোগ্রামিংয়ে প্রয়োজনীয় মেমোরি বরাদ্দ এবং মুক্ত করার ক্ষমতা দেয়, যা প্রোগ্রামিংকে আরও কার্যকরী এবং ব্যবহারকারী বান্ধব করে তোলে। malloc()
, calloc()
, realloc()
, এবং free()
ফাংশন ব্যবহার করে প্রোগ্রামাররা প্রোগ্রামের মেমোরি ব্যবস্থাপনা আরও দক্ষতার সাথে করতে পারেন।
malloc()
এবং calloc()
এর পার্থক্য এবং প্রয়োগসি প্রোগ্রামিং ভাষায় malloc()
(memory allocation) এবং calloc()
(contiguous allocation) ফাংশন দুটি ডাইনামিক মেমোরি বরাদ্দ করার জন্য ব্যবহৃত হয়। তবে, এই দুটি ফাংশনের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে, যা তাদের ব্যবহারকে নির্ধারণ করে।
এখানে malloc()
এবং calloc()
এর পার্থক্য এবং তাদের প্রয়োগ সম্পর্কে বিস্তারিত আলোচনা করা হলো।
malloc()
– মেমোরি বরাদ্দ করাmalloc()
ফাংশনটি একটি নির্দিষ্ট আকারের মেমোরি ব্লক বরাদ্দ করে এবং মেমোরির শুরুতে একটি পয়েন্টার রিটার্ন করে। তবে, এটি বরাদ্দ করা মেমোরি ব্লকটি অ্যানডিফাইনড মান (garbage values) দিয়ে পূর্ণ রাখে, অর্থাৎ এতে কোনো প্রাথমিক মান থাকে না।
void *malloc(size_t size);
size
– বরাদ্দ করতে চাওয়া মেমোরির আকার (বাইটে)।#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
// 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ
ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed.\n");
return 1; // মেমোরি বরাদ্দ ব্যর্থ
}
// বরাদ্দ করা মেমোরি ব্যবহার
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
// আউটপুট
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
// বরাদ্দকৃত মেমোরি মুক্ত করা
free(ptr);
return 0;
}
এখানে malloc()
ফাংশনটি 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করেছে, এবং ptr
পয়েন্টার দ্বারা সেই মেমোরি অ্যাক্সেস করা হয়েছে।
malloc()
শুধুমাত্র মেমোরি বরাদ্দ করে এবং এটি পূর্ববর্তী মান প্রদান না করে। অর্থাৎ, বরাদ্দ করা মেমোরি ব্লকটি কোনো মান দিয়ে পূর্ণ থাকে না (গার্বেজ মান)।calloc()
– মেমোরি বরাদ্দ এবং ইনিশিয়ালাইজেশনcalloc()
ফাংশনটি মেমোরির একটি ব্লক বরাদ্দ করে এবং সেই মেমোরির প্রতিটি অংশকে শূন্য (0) দিয়ে পূর্ণ করে দেয়। এটি malloc()
এর মতো, তবে এটি মেমোরি বরাদ্দ করার পাশাপাশি বরাদ্দকৃত মেমোরি ইনিশিয়ালাইজও করে।
void *calloc(size_t num, size_t size);
num
– বরাদ্দ করতে চাওয়া এলিমেন্টের সংখ্যা।size
– প্রতিটি এলিমেন্টের আকার (বাইটে)।#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
// 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ এবং সবগুলোকে শূন্য দিয়ে পূর্ণ করা
ptr = (int *)calloc(5, sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed.\n");
return 1; // মেমোরি বরাদ্দ ব্যর্থ
}
// আউটপুট
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // সবগুলো ভ্যালু হবে 0
}
// বরাদ্দকৃত মেমোরি মুক্ত করা
free(ptr);
return 0;
}
এখানে calloc()
ফাংশনটি 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করেছে এবং সবগুলোকে 0 দিয়ে পূর্ণ করেছে।
calloc()
মেমোরি বরাদ্দ করার পাশাপাশি এটি প্রতিটি ব্লককে শূন্য (0) দিয়ে পূর্ণ করে। এটি মেমোরি ইনিশিয়ালাইজেশন সরবরাহ করে।malloc()
এবং calloc()
এর মধ্যে পার্থক্যবৈশিষ্ট্য | malloc() | calloc() |
---|---|---|
ইনিশিয়ালাইজেশন | বরাদ্দকৃত মেমোরি ব্লকটি অ্যানডিফাইনড মান (garbage values) দিয়ে পূর্ণ থাকে। | বরাদ্দকৃত মেমোরি ব্লকটি শূন্য (0) দিয়ে পূর্ণ থাকে। |
আর্গুমেন্ট | একক আর্গুমেন্ট (মেমোরির আকার)। | দুটি আর্গুমেন্ট (এলিমেন্ট সংখ্যা এবং প্রতিটি এলিমেন্টের আকার)। |
প্রকৃতি | একক আকারের মেমোরি বরাদ্দ করে। | একটি বৃহৎ ব্লক বরাদ্দ করে এবং প্রতিটি অংশে শূন্য মান স্থাপন করে। |
পারফরম্যান্স | সাধারণত দ্রুত, কারণ এটি ইনিশিয়ালাইজেশন করে না। | কিছুটা ধীর, কারণ এটি মেমোরি ইনিশিয়ালাইজ করে। |
ফাংশন | কাজ | সিঙ্কট্যাক্স |
---|---|---|
malloc() | মেমোরি বরাদ্দ করে, কিন্তু ইনিশিয়ালাইজেশন করে না | void *malloc(size_t size); |
calloc() | মেমোরি বরাদ্দ করে এবং ইনিশিয়ালাইজ করে (সব অংশে শূন্য মান স্থাপন) | void *calloc(size_t num, size_t size); |
malloc()
এবং calloc()
ফাংশন দুটি ডাইনামিক মেমোরি বরাদ্দ করতে ব্যবহৃত হয়, তবে malloc()
মেমোরি বরাদ্দের পর মেমোরি ইনিশিয়ালাইজেশন করে না, এবং calloc()
ইনিশিয়ালাইজেশন সহ মেমোরি বরাদ্দ করে (যা সবগুলো এলিমেন্ট শূন্য মান দিয়ে পূর্ণ থাকে)।
মেমোরি লিক (Memory Leak) হচ্ছে এমন একটি পরিস্থিতি, যেখানে প্রোগ্রাম ডাইনামিক মেমোরি বরাদ্দ করে, কিন্তু সেই মেমোরি পরবর্তীতে মুক্ত করা হয় না। এর ফলে, ব্যবহৃত মেমোরি কখনও সিস্টেমের কাছে ফেরত যায় না, যা শেষে সিস্টেমের মেমোরি কমে যেতে পারে এবং প্রোগ্রামটি স্লো হয়ে পড়তে পারে বা ক্র্যাশ করতে পারে। মেমোরি লিক সিস্টেমের জন্য একটি গুরুতর সমস্যা হতে পারে, বিশেষত দীর্ঘ সময় ধরে চলমান প্রোগ্রামের ক্ষেত্রে।
malloc()
, calloc()
, realloc()
দ্বারা বরাদ্দকৃত) মুক্ত না করা।NULL
করা না বা নতুন ডাটা অ্যাসাইন করা)।মেমোরি বরাদ্দের পরে সবসময় free()
ব্যবহার করুন:
malloc()
, calloc()
, বা realloc()
ফাংশন দ্বারা বরাদ্দকৃত মেমোরি মুক্ত করতে free()
ফাংশন ব্যবহার করতে হবে।free()
ফাংশনটি মেমোরি মুক্ত করার পরে, সেই পয়েন্টারটি NULL
করে দিন। এটি পরবর্তীতে অবৈধ অ্যাক্সেস থেকে রক্ষা করবে।উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
// ডাইনামিক মেমোরি ব্যবহার করা
for (int i = 0; i < 10; i++) {
ptr[i] = i + 1;
}
// মেমোরি মুক্ত করা
free(ptr);
ptr = NULL; // মেমোরি মুক্ত করার পরে পয়েন্টারটি NULL করা
return 0;
}
পয়েন্টারকে NULL
করতে হবে:
free()
ফাংশন ব্যবহার করার পর, পয়েন্টারটি NULL
করে দিন, যাতে পরবর্তীতে সেই পয়েন্টারে অ্যাক্সেস না করা যায়। এটি dangling pointer সমস্যা প্রতিরোধ করবে।উদাহরণ:
int *ptr = (int *)malloc(sizeof(int));
free(ptr);
ptr = NULL; // মেমোরি মুক্ত করার পরে পয়েন্টারকে NULL করা
free()
কল নিশ্চিত করুন:free()
কল করা উচিত।ভুল পয়েন্টার ব্যবহার এড়িয়ে চলুন:
উদাহরণ:
int *ptr = (int *)malloc(10 * sizeof(int));
// নতুন মেমোরি বরাদ্দ করার আগে পুরনো মেমোরি মুক্ত করা উচিত
free(ptr); // পুরনো মেমোরি মুক্ত করা
ptr = (int *)malloc(20 * sizeof(int)); // নতুন মেমোরি বরাদ্দ করা
মেমোরি লিক ডিটেকশন টুলস ব্যবহার করুন:
Valgrind উদাহরণ:
valgrind --leak-check=full ./your_program
এটি মেমোরি লিক সম্পর্কে বিস্তারিত প্রতিবেদন তৈরি করবে।
malloc()
, calloc()
, এবং realloc()
দ্বারা বরাদ্দকৃত মেমোরি সবসময় free()
ব্যবহার করে মুক্ত করতে হবে।NULL
করা ভালো অভ্যাস।realloc()
এর মাধ্যমে মেমোরি পুনরায় বরাদ্দrealloc()
(reallocation) ফাংশনটি সি প্রোগ্রামিংয়ে মেমোরি ব্লকের আকার পরিবর্তন করার জন্য ব্যবহৃত হয়। এটি পূর্বে বরাদ্দকৃত মেমোরি ব্লকের আকার বাড়াতে বা কমাতে সাহায্য করে। যখন আপনি ডাইনামিকভাবে মেমোরি বরাদ্দ করেন, তখন মেমোরি ব্লকের আকারের পরিবর্তন প্রয়োজন হতে পারে, এবং realloc()
এর মাধ্যমে মেমোরি ব্লকটি পুনরায় বরাদ্দ করা যায়।
realloc()
এর কাজ:realloc()
ফাংশনটি একটি পূর্ববর্তী বরাদ্দকৃত মেমোরি ব্লককে পুনরায় বরাদ্দ করে এবং তার আকার পরিবর্তন করে।NULL
রিটার্ন করতে পারে।realloc()
সফলভাবে কাজ করে, এটি নতুন মেমোরির ঠিকানা রিটার্ন করে, যা আপনাকে নতুন আকারের মেমোরি ব্যবহারের সুযোগ দেয়।void *realloc(void *ptr, size_t new_size);
ptr
– পূর্বে বরাদ্দকৃত মেমোরির পয়েন্টার।new_size
– নতুন মেমোরি আকার (বাইটে)।#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int i;
// প্রথমে 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ
ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
// প্রথম 5টি ইন্টিজার ইনিশিয়ালাইজ করা
for (i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
// মেমোরি আকার বাড়ানো, 10টি ইন্টিজারের জন্য নতুন মেমোরি বরাদ্দ
ptr = (int *)realloc(ptr, 10 * sizeof(int));
if (ptr == NULL) {
printf("Memory reallocation failed.\n");
return 1;
}
// নতুন 5টি ইন্টিজার ইনিশিয়ালাইজ করা
for (i = 5; i < 10; i++) {
ptr[i] = i + 1;
}
// পুরো মেমোরি আউটপুট করা
for (i = 0; i < 10; i++) {
printf("%d ", ptr[i]);
}
// বরাদ্দকৃত মেমোরি মুক্ত করা
free(ptr);
return 0;
}
malloc()
ফাংশন ব্যবহার করে 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করা হয়েছে।realloc()
ফাংশন ব্যবহার করে মেমোরি ব্লকটির আকার বাড়ানো হয়েছে, 5টি থেকে 10টি ইন্টিজার সংরক্ষণের জন্য।free()
ফাংশন ব্যবহার করে বরাদ্দকৃত মেমোরি মুক্ত করা হয়েছে।realloc()
ফাংশনটি সফলভাবে মেমোরি পুনরায় বরাদ্দ করলে নতুন মেমোরি ব্লকের ঠিকানা রিটার্ন করে। এটি মেমোরির পয়েন্টারকে আপডেট করতে হয়। যদি আপনি নতুন মেমোরি ব্লকের ঠিকানা ফিরে না নেন, তবে আপনি NULL পয়েন্টার পাবেন এবং পুরানো মেমোরি ব্লকটি পরিবর্তন হবে না।realloc()
ফাংশনটি সফল না হয়, এটি NULL
রিটার্ন করবে এবং আগের মেমোরি ব্লকটি অপরিবর্তিত থাকবে। এজন্য, এটি ব্যবহার করার সময় সতর্ক থাকতে হবে এবং পয়েন্টার যাচাই করা উচিত।realloc()
ফাংশনটি মেমোরি ব্লকের আকার পরিবর্তন করার সময় মেমোরি স্থানান্তর করতে পারে (যদি প্রয়োজন হয়), এবং এই কারণে নতুন পয়েন্টারটি আগের পয়েন্টার থেকে আলাদা হতে পারে।realloc()
ফাংশনটি পূর্বে বরাদ্দকৃত মেমোরি ব্লকের আকার পরিবর্তন করতে ব্যবহৃত হয়। এটি পুরানো মেমোরি ব্লকে থাকা ডেটা নতুন ব্লকে কপি করে এবং নতুন মেমোরি ব্লকের ঠিকানা রিটার্ন করে। এটি মেমোরি ব্যবস্থাপনার জন্য খুবই গুরুত্বপূর্ণ এবং ডাইনামিক মেমোরি ম্যানিপুলেশনের ক্ষেত্রে সহায়ক।
common.read_more